package leetcode.editor.cn.dsa01_array;
//给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转。
public class ReverseInteger7_2 {
    public static void main(String[] args) {
        Solution solution = new ReverseInteger7_2().new Solution();
        // 测试数据
        int[] arr = {123, -123, 120, 1534236469, Integer.MAX_VALUE, Integer.MIN_VALUE};
        for (int i = 0; i < arr.length; i++) {
            int result = solution.reverse(arr[i]);
            System.out.println(arr[i] + "====" + result);
        }
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        /**
         * 解法二，优化解法思路：
         * 1.整数转字符串，再转字符数组
         * 2.交换首位(start)和末位(end)数字
         * 3.循环操作：依次交换第二(start++)和倒数第二个(end--)
         * 直到数组剩下1个或0个元素
         * 4.将原数组转成字符串，再转成整数输出
         *
         * 注意事项：
         *   边界问题
         *       数组索引越界：数组长度为偶数，反转完成标志为start>end；
         *          为奇数时反转完成标志为start==end
         *       数值溢出边界：溢出则返回0
         *   细节问题
         *       首位不为0
         *       符号处理
         * @param x 指定整数
         * @return 反转后的整数，或0
         */
        public int reverse(int x) {
            if (x == Integer.MIN_VALUE || x == Integer.MAX_VALUE) {
                // 整数类型的最小值的绝对值比最大值的绝对值大1
                return 0;
            }
            int sign = x > 0 ? 1 : -1; // 取符号位
            x = x < 0 ? -x : x; // 无论正负，都当成正数(Integer.MIN_VALUE除外)
            // 1.整数转字符串，再转字符数组
            char[] chars = String.valueOf(x).toCharArray();
            // 2.交换首位(start)和末位(end)数字
            // 3.循环操作：依次交换第二(start++)和倒数第二个(end--)
            int start = 0, end = chars.length - 1;
            while(start < end) { // 反转完成的标志： start>=end
                // 交换两端等距离的元素
                char temp = chars[start];
                chars[start] = chars[end];
                chars[end] = temp;
                start++;
                end--;
            }
            // 3.将原数组转成字符串，再转成整数输出
            long value = Long.parseLong(String.valueOf(chars)); // 用long类型避免溢出
            boolean b = value > Integer.MAX_VALUE; // 值越界：溢出则返回0
            int ret = b ? 0 : (int)value;
            return ret * sign;
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)

}